package com.example.design.leetcode.arrayAndString;

//剑指 Offer 29. 顺时针打印矩阵
//输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
//    示例 1：
//
//    输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//    输出：[1,2,3,6,9,8,7,4,5]
//    示例 2：
//
//    输入：matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//    输出：[1,2,3,4,8,12,11,10,9,5,6,7]
//
//    限制：
//    0 <= matrix.length <= 100
//    0 <= matrix[i].length<= 100
//    注意：本题与主站 54 题相同：https://leetcode-cn.com/problems/spiral-matrix/


//标签：二维数组
public class Practice06 {
    public int[] spiralOrder(int[][] matrix) {
        if (matrix.length == 0) {
            return new int[0];
        }
        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0 ;
        int bottom = matrix.length - 1;

        int x = 0;
        int[] res = new int[matrix[0].length*matrix.length];

        while (true) {
            // 从左到右遍历
            for (int i = left; i<=right; i++) {
                res[x++] = matrix[top][i];
            }
            // top下移
            if (++top > bottom) {
                break;
            }
            // 从上到下遍历
            for(int i = top; i <= bottom; i++) {
                res[x++] = matrix[i][right];
            }
            // right左移
            if(--right < left) {
                break;
            }
            // 从右到左遍历
            for(int i = right; i >= left;i--) {
                res[x++] = matrix[bottom][i];
            }
            // bottom上移
            if (--bottom < top) {
                break;
            }
            // 从下到上
            for (int i= bottom; i>=top; i--) {
                res[x++] = matrix[i][left];
            }
            if (++left > right) {
                break;
            }
        }
        return res;
    }
}
